package es.uca.plii.warrenl0;

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

/**
 * Implementación concreta de una EntidadL0 de tipo query
 * @author Rafael Sánchez, Alfonso Sendra
 */
public class Query extends EntidadL0 {

    /**
     * Constructor de la clase a partir del nodo raiz
     * @param nodo el nodo raiz
     * @throws Exception
     */
    public Query(Nodo nodo) throws Exception
    {
        super(nodo);
    }

    /**
     * Implementación específica de las instrucciones del elemento programa.
     * @return Un texto con las instrucciones.
     */
    @Override
    protected Comparator<Integer> comparadorOrdenNodos() {

        return new Comparator<Integer>() {

            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        };

    }

     /**
     * Implementación específica de las instrucciones del elemento programa.
     * @return Un texto con las instrucciones.
     */
    @Override
    public String instructionForm() {

        StringBuilder tr = new StringBuilder();
        Map<Integer,CompInstruccion> flt = new TreeMap<Integer,CompInstruccion>(comparadorOrdenNodos());
        this.nodoRaiz.obtenerInstructions(flt);
        for(Integer i : flt.keySet())
        {
            tr.append("put_structure ");
            tr.append(flt.get(i).cabecera);
            tr.append(",");
            tr.append("X");
            tr.append(i);
            tr.append("\n");
            for (Integer j : flt.get(i).argumentos)
            {
                //si ya he utilizado Xi uso set_value
                //si no he utilizado Xi uso set_variable
                if (tr.indexOf("X" + j) > 0)
                    tr.append("set_value ");
                else
                    tr.append("set_variable ");
                tr.append("X");
                tr.append(j);
                tr.append("\n");
            }
        }
        return tr.toString();
    }
  

}
